#include "tests.h"
#include "commun/utilise_sdl.h"
#include "reseau/client_reseau.h"
#include "reseau/serveur_reseau.h"
#include "commun/instantane_du_piano.h"
#include "commun/sous_systeme.h"
#include "thread/thread.h"
#include "temps/minuterie.h"
#include "temps/retour_vers_le_futur.h"

#include "reseau/synchronisation.h"

#include <iostream>

using namespace std;

namespace {
	struct cln : public thread_acteur {
		void executer() { executer2("localhost"); }
		void executer2(std::string hote) {
			try {
				client_reseau cl(hote, 45049);
				cout << "[CLIENT] Exécution du protocole de synchronisation... " << flush;
				synchronisation<client_reseau> protocole_de_synchro(cl);
				cout << "Terminé." << endl;
				cout << "[CLIENT] Santé de la connexion : " << protocole_de_synchro.sante_connexion() * 100.0f << "%" << endl;
			}
			catch(erreur const& err) {
				cerr << "[CLIENT] Erreur fatale: " << (string)err << endl;
			}
		}
	};
	
	struct srv : public thread_acteur {
		void executer() {
			try {
				serveur_reseau sr(45049);
				
				cout << "[SERVEUR] Attente d'une connexion" << endl;
				while(!sr.occupe())
					sr.accepter_connexions();
				cout << "[SERVEUR] Exécution du protocole de synchronisation... " << flush;
				synchronisation<serveur_reseau> protocole_de_synchro(sr);
				cout << "Terminé." << endl;
				cout << "[SERVEUR] Delta entre les deux univers : " << doc_emmett_brown::instance().delta(0) << "ms" << endl;
				cout << "[SERVEUR] Temps de roundtrip moyen : " << protocole_de_synchro.roundtrip_moyen() << "ms" << endl;
				cout << "[SERVEUR] Santé de la connexion : " << protocole_de_synchro.sante_connexion() * 100.0f << "%" << endl;
			}
			catch(erreur const& err) {
				cerr << "[SERVEUR] Erreur fatale: " << (string)err << endl;
			}
		}
	};
}

void calcul_roundtrip() {
	cout << "Calcul de roundtrip" << endl;
	module_sdl lancer_sdl;
	{
		module_reseau lancer_reseau;
		{
			cln c;
			srv s;
			/*thread tS(s);
			temps::attendre(1000);
			thread tC(c);*//**/
			cout << "(s)erveur/(c)lient? ";
			char chx;
			cin >> chx;
			if(chx == 's')
				s.executer();
			else {
				cout << "Nom de l'hôte ? ";
				std::string h;
				cin >> h;
				c.executer2(h);
			}
			 /**/
		}
	}
	
}
